Skip to content

feat: edit bot CLI and model from dashboard#317

Merged
deepcoldy merged 3 commits into
deepcoldy:masterfrom
icankeep:feature/dashboard-bot-agent-switch
Jun 30, 2026
Merged

feat: edit bot CLI and model from dashboard#317
deepcoldy merged 3 commits into
deepcoldy:masterfrom
icankeep:feature/dashboard-bot-agent-switch

Conversation

@icankeep

@icankeep icankeep commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add a CLI / Model section to the Bot Defaults dashboard so existing bots can switch agent runtime without editing bots.json manually.
  • Expose model/wrapper metadata through /api/bots and add a dashboard-to-daemon agent update route.
  • Persist cliId, wrapperCli, and model together in the daemon, with TTADK wrapper selection support and next-session semantics.

Fixes #316

Test Plan

  • corepack pnpm vitest run --project unit test/dashboard-bot-payload.test.ts test/dashboard-bot-defaults-cliid.test.ts test/dashboard-ipc.test.ts
  • corepack pnpm exec tsc --noEmit

中文说明

改动概览

  • 在“数字员工档案 / Bot Defaults”页面增加“CLI / 模型”配置区,让已有 bot 可以直接在 Dashboard 上切换 agent 运行时,不再需要手动编辑 bots.json。
  • /api/bots 透出 model / wrapperCli 等元数据,并新增 Dashboard 到 daemon 的 agent 更新代理路由。
  • daemon 端新增 /api/bot-agent,保存时一次性写入 cliId、wrapperCli、model,并同步内存配置;改动只影响后续新会话。
  • 支持 TTADK wrapper 选择项,例如 ttadk-x-codex,并复用现有 /api/cli-options 作为选项来源。

解决的问题

创建机器人后,原来 Dashboard 无法更改 bot 的 CLI 或模型。例如一个创建为 TraeX 的机器人,如果后续想改成 Claude、Codex 或 TTADK,只能手动改 bots.json 或重新创建机器人。这个 PR 把该能力放到 Bot Defaults 页面中,并确保 wrapper 与 model 一起保存,避免配置不一致。

测试计划

  • corepack pnpm vitest run --project unit test/dashboard-bot-payload.test.ts test/dashboard-bot-defaults-cliid.test.ts test/dashboard-ipc.test.ts
  • corepack pnpm exec tsc --noEmit

@icankeep icankeep requested a review from deepcoldy as a code owner June 26, 2026 12:40
@icankeep

Copy link
Copy Markdown
Contributor Author
image

@icankeep

Copy link
Copy Markdown
Contributor Author
image

@deepcoldy

Copy link
Copy Markdown
Owner

功能挺好,能在 dashboard 直接改 bot 的 CLI / 模型,机制(写盘、wrapper 解析、单测)都没问题。只有一个实际问题想提醒一下 👇

问题:在 dashboard 切了 CLI 之后,那个 bot 已经在进行中的旧对话会被弄坏

举个例子:某个群正在用 Claude 聊。管理员在 dashboard 把这个 bot 改成了 Codex。

  • 当前这个会话的进程还活着时,它还是用 Claude,没事。
  • 但只要这个会话的进程重启一次——比如 daemon 重启了,或者会话闲置被回收、下一条消息把它唤醒——botmux 就会拿旧的 Claude 对话历史,去用 Codex 来「继续」。可 Codex 接不了 Claude 的历史:
    • 默认 PTY 后端:续不上,旧对话静默从头开始(或报错),上下文全丢;
    • tmux / herdr 后端:旧会话直接被 kill。
  • 也就是说,没人点 /restart,旧对话也会在下一条消息时自己切到新 CLI 并断掉

为什么会这样

启动 CLI 的那段代码(forkWorker)不管是开新会话还是恢复旧会话,永远读「bot 当前的设置」(botCfg.cliId / wrapperCli / model),它没记住「这个会话当初是用哪个 CLI 起的」。会话记录里也只持久化了 cliId/cliSessionId,没有 wrapperCli/model。所以一改 bot 设置,旧会话恢复时就被带跑了。

顺带:提示文案「改动只影响下个新会话;运行中的会话需要 /restart 后才会换 CLI / 模型」其实和真实行为不符(闲置/重启后会自动换),建议改掉。

怎么修(建议)

让每个会话在创建时把自己用的 CLI / wrapper / 模型记下来;恢复会话时优先用「这个会话自己记的 CLI」,而不是 bot 的最新设置。

代码里已经有现成的范式可照抄——sandbox 这个设置就是这么「按会话创建时冻结」的(types.ts 里有注释说明:live bot flag 可后改,但会话的 sandbox 状态在创建时冻结,restore/restart 绝不回溯影响历史会话;forkWorker resume 时读 ds.session.sandbox 而非 botCfg)。cliId / wrapperCli / model 照这套来即可。另外 sessionCliId(ds, botCfg)(= ds.session.cliId ?? botCfg.cliId)这个 helper 已经存在,但目前只用于渲染、没用于真正 spawn——这个不一致正是 bug 面。

如果这次 PR 不想动这么大,那至少做两件小事:

  1. 把提示文案改成真实行为;
  2. 切 CLI 时,主动把这个 bot 现有的活跃会话干净地结束掉(close 而非 kill-resume),让它们在新 CLI 上重新开,而不是半路硬接。

补充:只改模型、CLI 不变基本是安全的(每次 spawn 都重新读 --model);危险的只有改 CLI

@icankeep

icankeep commented Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

@deepcoldy 已按“旧会话保留旧 CLI / 模型,新会话使用新配置”的方向更新。

本次修订:

  • 在 Session 上冻结创建时的 agent launch 配置:cliId、cliPathOverride、wrapperCli、model。
  • forkWorker fresh spawn 时写入冻结配置;resume / cold resume 时优先使用 session 记录的配置,不再读取 bot 最新 CLI / wrapper / model 去恢复旧会话。
  • 保留向后兼容:历史 session 缺字段时仍 fallback 到 bot 当前配置。
  • 更新 dashboard 文案:保存后只影响新创建会话,已有会话继续使用创建时 CLI / 模型;如果要让旧对话使用新配置,需要关闭后重新开始。
  • 增加回归测试覆盖:fresh session 冻结 wrapper/model、已预填 cliId 的 fresh session 仍补齐 wrapper/model、resume 使用 session 记录的旧 CLI / wrapper / model。

验证:

  • corepack pnpm vitest run --project unit test/session-lifecycle-start.test.ts test/dashboard-bot-payload.test.ts test/dashboard-bot-defaults-cliid.test.ts test/dashboard-ipc.test.ts
  • corepack pnpm exec tsc --noEmit

@icankeep icankeep force-pushed the feature/dashboard-bot-agent-switch branch from 222ce54 to dba3904 Compare June 29, 2026 08:18
@icankeep icankeep force-pushed the feature/dashboard-bot-agent-switch branch from dba3904 to 82e7a3a Compare June 29, 2026 09:57
freeze 只在 !resume 时写入,且 resume 返回的 wrapperCli/model 不回退 botCfg。
导致本次修复前就存在的老会话(历史只盖过 cliId、没有 wrapperCli/model 字段)
升级后首次 resume 时丢掉 wrapper/model:ttadk/aiden/cjadk 这类带 wrapper 的 bot
会用裸 CLI 重启、丢网关鉴权起不来。

改为以 session.agentFrozen 标记 gate 一次性冻结(不再看 resume):
- 全新会话与「老会话首次 resume」都会从 botCfg 用 ?? 回填仍缺失的字段并落盘;
- 已冻结的会话原样信任 session 值,botCfg 后续改动绝不回溯影响;
- 标记区分「老会话未冻结」与「冻结为无 wrapper」,无 wrapper 会话不会被 bot 后加的 wrapper 带跑。

补测:冻结会话 resume 忽略 botCfg 变更;老会话首次 resume 回填 wrapper/model。
@deepcoldy deepcoldy merged commit 4251951 into deepcoldy:master Jun 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Dashboard should allow changing an existing bot's CLI and model

2 participants